package com.study.spark.scala.chapter05

object Scala05_Function_Hell {
  def main(args: Array[String]): Unit = {
    // TODO 函数式编程

    // TODO 1.函数也是对象
    def func1(): Unit ={
      println("func1...")
    }

    // 语法中允许函数参数列表为空时可以省略小括号
    val f1 = func1
    println("********")
    val f2 = func1()
    println("********")
    // 如果把函数作为整体，而不是执行结果赋值给变量，那么就要使用特殊符号：下划线
    val f3 = func1 _  //下划线将函数作为一个整体，返回内存地址
    println(f3)
    /*
func1...
********
func1...
********
com.study.spark.scala.chapter05.Scala05_Function_Hell$$$Lambda$5/6738746@7cf10a6f
     */

    //f1() 编译报错

    // 万物皆对象。函数对象也有类型
    // 函数独立使用时，参数声明没有个数限制
    // 但是如果将函数作为对象给别人使用时，那么函数胡参数声明个数最多为22个
//    val f3 : Function0[Unit] = func1 _
    // 函数类型的第二种更加直观的写法（输入类型）=>输出类型
//    val f4 : () => Unit = func1 _

    // 之所以使用下划线让函数作为对象使用，因为代码中没有明确变量的类型，所有需要通过取值来判断
    // 如果变量声明类型为函数类型，那么就可以不使用下划线让函数作为对象
    def test(name : String,age : Int): String ={
      "123"
    }
    val f5 : (String ,Int) => String =test
    println(f5)
    val f6 =test _
    println(f6)
    val f7 =test("ljh",21)
    println(f7)
    /*
com.study.spark.scala.chapter05.Scala05_Function_Hell$$$Lambda$6/804581391@c818063
com.study.spark.scala.chapter05.Scala05_Function_Hell$$$Lambda$7/1057941451@75bd9247
123
     */

  }

}
  